//
//  CJHomeViewModels.swift
//  SinaWeibo
//
//  Created by 程建 on 16/9/27.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
import SDWebImage


class CJHomeViewModels: NSObject {
    
    //定义模型数组
    lazy var viewModelArray:[CJStatusViewModel] = [CJStatusViewModel]()
    
    //获取数据
    func loadData(isPullup:Bool, finish:@escaping (Bool,Int)->()) {
        
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        var parameters = ["access_token" : CJUserAccountViewModel.shardAccountViewModel.userAccount?.access_token ?? ""]
        
        //上拉加载更多需要在参数中添加max_id的参数
        if isPullup {
            
            let id = viewModelArray.last?.status?.id ?? 0
            
            parameters["max_id"] = "\(id - 1)"
            
        }else{
            //第一次加载数据的时候 数组为空数组 获取的id就是0
            let id = viewModelArray.first?.status?.id ?? 0
            //下拉刷新或者初次加载数据
            //如果since_id有值 就只会返回比该微博新的微博默认是20条
            parameters["since_id"] = "\(id)"
        }
        
        
        CJNetworkTools.sharedTools.request(method: .GET, urlString: urlString, parameters: parameters) { (responseObject, error) in
            if error != nil {
                //提示用户数据加载失败
                //SVProgressHUD.showError(withStatus: errorTip)
                
                finish(false,0)
                
                return
            }
            
            //解析数据  转换字典数据,类型转换,字典转模型
            let dict = responseObject as! [String:Any]
            
            //根据statues在字典中取值
            guard let array = dict["statuses"] as? [[String:Any]] else{
                
               // finish(false,0)
                
                return
            }
            
            
            //上拉加载更多 数据的拼接 :追加在viewModelArray最后
            //下拉刷新  数据的拼接: 追加在ViewModelsArray的前面
            
            var tempArray = [CJStatusViewModel]()
            for dict in array {
                //kVC字典转模型
                // let s = CJStatus(dict: dict)
                
                //使用YYModel方式来字典转模型
                let s = CJStatus()
                let viewModel = CJStatusViewModel()
                
                s.yy_modelSet(with: dict)
                
                viewModel.status = s
                
                //self.viewModelArray.append(viewModel)
                
                tempArray.append(viewModel)
                
            }
            
            //操作viewModelArray数组
            if isPullup {
                //上拉加载更多  拼接在数组最后面
                self.viewModelArray += tempArray
            
            }else {
                self.viewModelArray = tempArray + self.viewModelArray
            }
            //程序员走到这边 标示模型数据已经有数据
            //需要刷新数据
            //self.tableView.reloadData()
            //执行闭包
            self.cacheSingleImage(dataArray: tempArray, cacheImageFinished: finish)
            
        }
        
    }

    private func cacheSingleImage(dataArray:[CJStatusViewModel],cacheImageFinished:@escaping (Bool,Int)->()) {
        
        //执行单张图片的下载任务
        //遍历数组
        
         //在外界显示实例化调度组  用来监听一组任务的完成
        let group = DispatchGroup.init()
        for viewModes in dataArray {
            //判断是否为单张图片
            if viewModes.pictureInfos?.count == 1 {
                //单张图片的下载
                let urlString = URL(string: viewModes.pictureInfos?.first?.wap_pic ?? "")
                
                //在开始异步任务之前 就应该入组  调度组中的异步任务 + 1
                group.enter()
                SDWebImageManager.shared().downloadImage(with: urlString, options: [], progress: nil, completed: { (image, _, _, _, _) in
                        //程序走到这个地方 表示单张图片已经被下载完毕
                        
                        //能够在这里执行回调
                        //这个地方只能够监听单张图片下载完毕
                        print("单张图片下载完成")
                        //出组 调度组中的异步任务 -1
                        group.leave()

                })
            }
        }
        //执行回调
        group.notify(queue: DispatchQueue.main) { 
            //执行回调
            print("所有图片下载完成")
            cacheImageFinished(true,dataArray.count)
        }
        
    }
}
